Prompt Harness

System Prompt 不是一坨文本

生产级的 System Prompt 不是想到什么写什么。它是分层管理的:身份层、环境层、工具层、行为层,各管各的,改一层不影响其他层。

「一坨文本」长什么样

常见的混乱写法

你是一个 AI 助手,名字叫 Alice。你可以搜索网页、读写文件、 现在是 2026 年,用户在中国。当用户让你搜索时用 web_search 工具, 回答时先思考再回答,不要编造信息。你的性格温暖友善, 文件操作用 file_read 和 file_write,用户的语言偏好是中文, 如果不确定就告诉用户你不知道...
身份、环境、工具、行为全混在一起。改一处可能影响全部,谁也说不清哪段影响了哪个行为。
分层管理:四层各司其职

点击每层查看它负责什么

身份层

我是谁?性格、角色、基本人设

定义 AI 的身份认同:
  • 名字、角色定位
  • 性格特征(友善 / 严谨 / 幽默…)
  • 基本能力边界(能做什么、不能做什么)
特点:几乎不变,一旦定好很少修改。

环境层

现在什么情况?系统状态、用户上下文

提供当前运行时信息:
  • 用户基本信息(语言偏好、时区…)
  • 当前操作系统、应用状态
  • 会话上下文(在哪个页面、之前做了什么)
特点:每次会话可能不同,但同一会话内相对稳定。

工具层

能用什么?可调用的工具和 API

注册 AI 可以使用的工具:
  • 工具名称和功能说明
  • 参数格式
  • 使用限制和注意事项
特点:随着功能迭代增删,变化频率中等。

行为层

怎么行动?输出格式、决策规则

规定 AI 的行动策略:
  • 回答风格和格式要求
  • 决策优先级(先做什么、后做什么)
  • 安全护栏(什么不能做、什么要确认)
特点:是产品迭代最频繁的部分:改一条策略就能改变 AI 行为。
分层的好处

改一层不影响其他层

加个新工具?只改工具层。调整回答风格?只动行为层。不会牵一发而动全身。

多人协作不冲突

产品改行为、工程师加工具、运营调人设,各改各的文件,Git 合并不冲突。

A/B 测试更精准

想测试不同的回答策略?只替换行为层,其他三层保持不变,变量单一。

排查问题更容易

AI 行为异常?按层检查:是身份搞错了、环境信息过时、工具描述有误、还是规则冲突?

一坨文本改一处可能影响全部。分层管理,改一层不影响其他层。生产级的 System Prompt 是四个独立管理的模块。
Prompt Harness

不用的东西别给 AI 看

如果你有 100 个工具,全部描述塞进 System Prompt,光工具描述就占几万 token。AI 和人一样:给太多信息反而找不到重点。

全量加载 vs 按需加载
全量加载
~34,000 tk
按需加载
~2,800 tk
拖动看差异

调整工具数量,看 Token 开销变化

50
17,500
全量加载 Token
1,550
按需加载 Token
91%
节省比例
按需加载怎么做

三步走:

① 首轮只给名字列表
System Prompt 里只放工具名 + 一句话说明,AI 知道有这个能力就行。

② 用到时再展开
AI 决定调用某个工具时,系统动态注入该工具的完整描述和参数格式。

③ 用完就收回
工具用完后,下一轮对话不再带完整描述,回到只有名字的状态。

类比:就像公司通讯录:你不需要每个人的完整简历,只需要名字和职位。真要找谁合作时,再去看详细资料。
AI 和人一样:给太多信息反而找不到重点。按需给、用到再展开。工具描述的按需加载,既省 Token 又提高准确率。
Prompt Harness

Skill:可运营的 Prompt 模块

System Prompt 管我是谁,Tool 管我能做什么,那 Skill 管什么?它管的是遇到某件事,怎么一步一步做好。文件即配置,版本可追溯。

三者对比

System Prompt

全局身份
定义 AI 是谁:名字、性格、基本原则。是所有对话的底色。
作用范围全局
修改频率很少
生命周期整个产品

Tool

能力注册
告诉 AI 有什么工具可以用:名字、参数、功能。是能力的菜单。
作用范围单次调用
修改频率中等
生命周期功能迭代

Skill

流程指引
一个完整的任务执行方案:什么时候触发、用哪些工具、按什么步骤来。
作用范围特定任务
修改频率高频迭代
生命周期独立版本
一个 Skill 的结构

点击每个区块展开说明

content-creator.skill

触发条件 什么时候启用这个 Skill
当用户说「帮我写文章」「我想写」「准备写」等触发词时,AI 自动加载这个 Skill 来指导后续行为。不是每次对话都加载,只在匹配时注入。
允许的工具列表 这个任务能用哪些工具
明确列出执行这个 Skill 时允许使用的工具。比如内容创作可能允许 web_search、note_read,但不允许 file_delete。通过白名单控制风险。
执行流程 一步一步怎么做
描述从头到尾的执行步骤:先确认需求 → 搜集素材 → 列大纲 → 逐段写作 → 整体润色 → 交付。每一步可以有分支和条件判断。
输出格式要求 最终产出长什么样
规定最终输出的格式、长度、风格。比如:标题不超过 20 字、分段清晰、口语化表达、结尾有行动建议。确保每次产出质量一致。
Skill 的生命周期
1
编写
一个文件,纯文本
2
注册
放到指定目录即生效
3
触发
匹配条件时自动加载
4
迭代
改文件 = 改行为,Git 追溯
为什么不直接写在 System Prompt 里?
System Prompt 是全局的,改了影响所有场景。Skill 是按需加载的,只在特定场景注入,不会污染其他任务的行为。而且 Skill 文件可以独立版本管理:谁改了什么、什么时候改的,一目了然。
Prompt 也需要可复用、可迭代、可追溯,Skill 就是 Prompt 的模块化。像管理代码一样管理 AI 的行为指引,每个任务一个文件,改了就生效。
Prompt Harness

提示词和缓存的微妙关系

KV Cache 的规则极其简单:前缀一模一样就命中,差一个字就全部重算。所以,往 System Prompt 里插入任何动态内容,都可能让缓存永远打不中。

指纹变了 = 缓存作废

每次请求,系统会对 System Prompt 算一个指纹(hash)

System: 你是助手。当前时间: 14:35:22
a3f7c2
MISS
System: 你是助手。当前时间: 14:35:23
b8e1d9
MISS
System: 你是助手。当前时间: 14:35:24
c4a2f6
MISS

每一秒时间不同 → 指纹不同 → 缓存永远命不中 → 每次都要从头算 → 成本翻倍。
这不只是时间戳的问题:任何动态内容插在 System Prompt 里都有同样效果。

Skill 的注入方式也影响缓存
把 Skill 插进 System
[System] 你是 AI 助手... [当前 Skill: 内容创作] 触发词:帮我写... 步骤:1. 确认需求... --- [User] 帮我写篇文章

切换 Skill 时 System 变了 → 缓存失效

~20%
Skill 作为独立消息追加
[System] 你是 AI 助手... --- [Assistant/Skill 消息] 当前 Skill: 内容创作 步骤:1. 确认需求... --- [User] 帮我写篇文章

System 永远不变 → 前缀缓存始终命中

~90%
模拟:10 次请求的缓存表现

缓存命中模拟器

假设 10 次请求中有 3 次切换了不同的 Skill。观察两种注入方式的缓存差异:

命中率:
KV Cache 的规则很简单:前缀一样就命中。所以,别动前缀。把所有可能变化的内容(Skill、上下文、时间)放到 System Prompt 之后,让前缀永远稳定。
1 / 4